<?php

declare(strict_types=1);

namespace DreamCat\StateMachineTest\Cases\Config;

use DreamCat\StateMachine\Error\DefineConfigException;
use DreamCat\StateMachine\Factory\ConfigParseFactory;
use DreamCat\StateMachine\Factory\MachineFactory;
use DreamCat\StateMachine\Parser\Impl\DirConfigParser;
use DreamCat\StateMachineTest\Demos\NoImplFactory;
use PHPUnit\Framework\TestCase;

/**
 * 解析目录测试
 * @author vijay
 */
class ParseDirConfigTest extends TestCase
{
    /**
     * 测试常规的验证
     * @return void
     * @throws DefineConfigException
     */
    public function testNormal(): void
    {
        $dir = __DIR__ . "/../../resources/dirDemoMachine";
        $parse = ConfigParseFactory::getConfigParser($dir);
        $def = $parse->parseConfig();
        $except = unserialize(file_get_contents("{$dir}/defineSeri.txt"));
        self::assertEquals($except, $def);
    }

    /**
     * 验证主目录不存在的情况
     * @return void
     * @throws DefineConfigException
     */
    public function testNoDir(): void
    {
        $this->expectException(DefineConfigException::class);
        $dir = uniqid("?testac@");
        $this->expectErrorMessage("指定的配置目录 {$dir} 不存在");
        $parse = new DirConfigParser($dir);
        $parse->parseConfig();
    }

    /**
     * 验证子目录不存在的情况
     * @return void
     */
    public function testNoSubDir(): void
    {
        $dir = realpath(__DIR__ . "/../../resources/noSubDir");
        $this->expectException(DefineConfigException::class);
        $this->expectErrorMessage("角色列表目录 {$dir}/roles 不存在");
        $parse = new DirConfigParser($dir);
        $parse->parseConfig();
    }

    /**
     * 测试不存在的工厂类场景
     * @return void
     * @throws DefineConfigException
     */
    public function testNoFactoryClass(): void
    {
        $this->expectException(DefineConfigException::class);
        $this->expectErrorMessage("状态机的工厂类 使用的类不存在 NoClass");
        $dir = __DIR__ . "/../../resources/error/noFactoryClass";
        $parse = ConfigParseFactory::getConfigParser($dir);
        $parse->parseConfig();
    }

    /**
     * 测试未实现指定接口的工厂类场景
     * @return void
     * @throws DefineConfigException
     */
    public function testNoImplFactory(): void
    {
        $this->expectException(DefineConfigException::class);
        $this->expectErrorMessage("状态机的工厂类 " . NoImplFactory::class . " 未实现指定接口 " . MachineFactory::class);
        $dir = __DIR__ . "/../../resources/error/noImplFactory";
        $parse = ConfigParseFactory::getConfigParser($dir);
        $parse->parseConfig();
    }
}

# end of file
